//
//  Optional+DBUnwrapped.swift
//  DBCA
//
//  Created by mugua on 2024/7/3.
//

import Foundation

public extension Optional where Wrapped == String {
    
    /// 如果为nil返回一个默认值 ""
    var value: Wrapped {
        return self ?? ""
    }
    
    /// 该 String? 类型为 nil 或者空字符串，则返回 true
    var isEmptyOrNil: Bool {
        switch self {
        case .none:
            return true
        case .some(let value):
            return value.isEmpty
        }
    }
}

public extension Optional where Wrapped == Int {
    
    /// 如果为nil返回一个默认值 0
    var value: Wrapped {
        return self ?? 0
    }
}

public extension Optional where Wrapped == Int64 {
    
    /// 如果为nil返回一个默认值 0
    var value: Wrapped {
        return self ?? 0
    }
}

public extension Optional where Wrapped == CGFloat {
    
    /// 如果为nil返回一个默认值 0
    var value: Wrapped {
        return self ?? 0
    }
}

public extension Optional where Wrapped == Double {
    
    /// 如果为nil返回一个默认值 0
    var value: Wrapped {
        return self ?? 0
    }
}

public extension Optional where Wrapped == Float {
    
    /// 如果为nil返回一个默认值 0
    var value: Wrapped {
        return self ?? 0
    }
}

public extension Optional where Wrapped == Bool {
    
    /// 如果为nil返回一个默认值 false
    var value: Wrapped {
        return self ?? false
    }
    
    /// 判断该可选Bool类型的值是否为 true
    var isTrue: Bool {
        return self == true
    }
    
    /// 判断该可选Bool类型的值是否为 fasle
    var isFalse: Bool {
        return self == false
    }
    
}

public extension Optional where Wrapped == [String: Any] {
    
    var value: Wrapped {
        return self ?? [String: Any]()
    }
}

public extension Optional where Wrapped: Collection {
    
    /// 该 Collection? 类型为 nil 或者空集合，则返回 true
    var isEmptyOrNil: Bool {
        switch self {
        case .none:
            return true
        case .some(let value):
            return value.isEmpty
        }
    }
    
}

public extension Optional {
    
    /// 该可选类型的值是否是 nil
    var isNil: Bool {
        return isNone
    }
    
    /// 该可选类型的值是否是 none
    var isNone: Bool {
        switch self {
        case .none:
            return true
        case .some(_):
            return false
        }
    }
    
    /// 该可选类型的值是否是 some
    var isSome: Bool {
        switch self {
        case .none:
            return false
        case .some(_):
            return true
        }
    }
    
}
